-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "wifidemo"
VERSION = "1.0.0"

-- 引入必要的库文件(lua编写), 内部库不需要require
sys = require("sys")
require("sysplus")

-- 配置 LED 和按钮引脚
local LED_PIN = 10            -- LED GPIO引脚 LEDA 10 LEDB 11  高电平有效
local BUTTON_PIN = 0         -- 按键 GPIO引脚  BOOT/GPIO0

-- 初始化状态
local CONNECTED = false      -- 当前网络连接状态
local IN_CONFIG_MODE = false -- 是否处于配网模式

-- 按键长按定时器
local button_timer = nil

-- 扫描结果
local scan_result = {}

-- 设置 GPIO 模式
local led = gpio.setup(LED_PIN, 0, gpio.PULLUP) -- LED 默认熄灭
gpio.setup(BUTTON_PIN, nil, gpio.PULLUP) --按钮 输入模式

-- LED 控制函数
local function led_blink(interval)
    sys.taskInit(function()
        while not CONNECTED and (IN_CONFIG_MODE or interval > 0) do
            led(1) -- 点亮
            sys.wait(interval)
            led(0) -- 熄灭
            sys.wait(interval)
        end
    end)
end

-- 进入配网模式
local function enter_config_mode()
    IN_CONFIG_MODE = true
    CONNECTED = false
    led_blink(200) -- 快闪表示配网模式

    -- 启动 AP 模式
    wlan.setMode(wlan.AP)
    wlan.createAP("ESP32_Config", "12345678") -- 配网热点名称和密码

    sys.wait(500)
    wlan.scan()

    -- 启动 HTTP 服务器
    httpsrv.start(80, function(client, method, uri, headers, body)

        if uri == "/config" and method == "POST" then
            local ssid, password = body:match("ssid=([%w%p]+)&password=([%w%p]+)")
            if ssid and password then
                print("收到配网信息: SSID=", ssid, ", Password=", password)

                wlan.setMode(wlan.STA)
                wlan.connect(ssid, password)

                return 200, {}, "ok"
            else
                return 400, {}, "请填写WIFI账号和密码"
            end

        --     -- /scan/go  启动AP 之后 scan就无法触发回调了 这里是多余的
        -- elseif uri == "/scan/go" then
        --     print("开启 WIFI扫描")
        --     wlan.scan()
        --     return 200, {}, "ok"
        -- 前端获取AP列表
        elseif uri == "/scan/list" then
            return 200, {["Content-Type"]="applaction/json"}, (json.encode({data=_G.scan_result, ok=true}))
        else
            -- 其他情况就是找不到了
            return 404, {}, "Not Found" .. uri
        end
    end)
end



-- 按键检测任务
sys.taskInit(function()
    local press_start_time = 0

    while true do
        if gpio.get(BUTTON_PIN) == 0 then -- 按下
            press_start_time = press_start_time + 50
            if press_start_time >= 5000 and not IN_CONFIG_MODE then -- 长按 5 秒
                print("进入配网模式")
                enter_config_mode()
            end
        else
            press_start_time = 0
        end
        sys.wait(50)
    end
end)




sys.taskInit(function()
    led_blink(1000)--慢闪
    -- 初始化 Wi-Fi
    sys.wait(1000)
    wlan.init()
    sys.wait(300)
    wlan.setMode(wlan.STATION)
    -- 默认连接 影响 scan 回调
    -- wlan.connect()

    -- 检查连接
    -- while wlan.ready() do
    --     led(1) -- 常亮
    --     sys.wait(3000)
    -- end




    -- wifi扫描成功后, 会有WLAN_SCAN_DONE消息, 读取即可
    sys.subscribe("WLAN_SCAN_DONE", function ()
        log.info("wifi扫描结束", "WLAN_SCAN_DONE")
        local result = wlan.scanResult()
        _G.scan_result = {}
        for k,v in pairs(result) do
            log.info("scan", (v["ssid"] and #v["ssid"] > 0) and v["ssid"] or "[隐藏SSID]", v["rssi"], (v["bssid"]:toHex()))
            if v["ssid"] and #v["ssid"] > 0 then
                table.insert(_G.scan_result, v["ssid"])
            end
        end
        log.info("scan", "aplist", json.encode(_G.scan_result))
    end)

    sys.subscribe("IP_READY", function(adapter)
        CONNECTED = true
        IN_CONFIG_MODE = false
        led(1) -- 常亮
        wlan.stopAP()
        httpsrv.stop(80)
        log.info("网络连接", "IP_READY")
    end)

    sys.subscribe("IP_LOSE", function(adapter)
        CONNECTED = false
        log.info("网络丢失", "IP_LOSE")
        led_blink(1000) -- 慢闪表示未连接
    end)




    -- Wi-Fi 事件回调  这段有大问题
    -- wlan.on("connect", function()
    --     CONNECTED = true
    --     IN_CONFIG_MODE = false
    --     led(1) -- 常亮
    --     print("WiFi 已连接")
    --     httpsrv.stop() -- 停止 HTTP 服务
    -- end)

    -- wlan.on("disconnect", function()
    --     CONNECTED = false
    --     led_blink(1000) -- 慢闪表示未连接
    --     print("WiFi 断开连接")
    -- end)


    while not CONNECTED  do
        print("WIFI定时扫描")
        wlan.scan()
        sys.wait(8000)
    end

end)


-- 启动系统
sys.run()
